﻿using System;

namespace Zo.Extensions
{
    /// <summary>
    /// 时间类型扩展。
    /// </summary>
    public static class DateTimeExtensions
    {
        /// <summary>
        /// 获得默认时间。
        /// </summary>
        /// <param name="dateTime">当前时间对象。</param>
        /// <returns>默认时间。</returns>
        public static DateTime GetDefaultTime(this DateTime dateTime) => new DateTime(1970, 1, 1);

        /// <summary>
        /// 获得当前时间的时间戳（秒级）。
        /// </summary>
        /// <param name="dateTime">当前时间对象。</param>
        /// <returns>时间戳。</returns>
        public static int GetTimeStamp(this DateTime dateTime)
        {
            var startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            var timeStamp = (dateTime.Ticks - startTime.Ticks) / 10000000;
            return (int)timeStamp;
        }

        /// <summary>
        /// 获得当前时间的时间戳（毫秒级）。
        /// </summary>
        /// <param name="dateTime">当前时间对象。</param>
        /// <returns>时间戳。</returns>
        public static long GetTimeStampByMillisecond(this DateTime dateTime)
        {
            return (long)(dateTime - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds;
        }

        /// <summary>
        /// 获得去除时分秒后的当前时间。
        /// </summary>
        /// <param name="dateTime">当前时间。</param>
        /// <returns></returns>
        public static DateTime GetToday(this DateTime dateTime) => new DateTime(dateTime.Year, dateTime.Month, dateTime.Day);

        /// <summary>
        /// 获得指定时间所在的星期的星期一的时间。
        /// </summary>
        /// <param name="dateTime">当前时间。</param>
        /// <returns>星期一的时间。</returns>
        public static DateTime GetCurrentWeek(this DateTime dateTime)
        {
            switch (dateTime.DayOfWeek)
            {
                case DayOfWeek.Monday:
                    return dateTime.GetToday();

                case DayOfWeek.Tuesday:
                    return dateTime.GetToday().AddDays(-1);

                case DayOfWeek.Wednesday:
                    return dateTime.GetToday().AddDays(-2);

                case DayOfWeek.Thursday:
                    return dateTime.GetToday().AddDays(-3);

                case DayOfWeek.Friday:
                    return dateTime.GetToday().AddDays(-4);

                case DayOfWeek.Saturday:
                    return dateTime.GetToday().AddDays(-5);

                case DayOfWeek.Sunday:
                    return dateTime.GetToday().AddDays(-6);
            }

            return dateTime.GetToday();
        }

        /// <summary>
        /// 获得指定时间所在的当月的 1 日的时间。
        /// </summary>
        /// <param name="dateTime">当前时间。</param>
        /// <returns>1 日的时间。</returns>
        public static DateTime GetCurrentMonth(this DateTime dateTime)
        {
            return new DateTime(dateTime.Year, dateTime.Month, 1);
        }

        /// <summary>
        /// 获得指定时间所在的季度的 1 日的时间。
        /// </summary>
        /// <param name="dateTime">当前时间。</param>
        /// <returns>本季 1 日的时间。</returns>
        public static DateTime GetCurrentSeason(this DateTime dateTime)
        {
            if (dateTime.Month <= 3)
            {
                return new DateTime(dateTime.Year, 1, 1);
            }

            if (dateTime.Month <= 6)
            {
                return new DateTime(dateTime.Year, 4, 1);
            }

            if (dateTime.Month <= 9)
            {
                return new DateTime(dateTime.Year, 7, 1);
            }

            if (dateTime.Month <= 12)
            {
                return new DateTime(dateTime.Year, 10, 1);
            }

            return dateTime;
        }

        /// <summary>
        /// 获得指定时间所在的当年的 1 月 1 日的时间。
        /// </summary>
        /// <param name="dateTime">当前时间。</param>
        /// <returns>当年的 1 月 1 日。</returns>
        public static DateTime GetCurrentYear(this DateTime dateTime)
        {
            return new DateTime(dateTime.Year, 1, 1);
        }

        /// <summary>
        /// 获得指定时间当天的开始时间和结束时间。
        /// </summary>
        /// <param name="dateTime">当前时间。</param>
        /// <returns>开始时间和结束时间。</returns>
        public static DateTime[] GetTodayScope(this DateTime dateTime)
        {
            var startTime = dateTime.GetToday();
            var endTime = startTime.AddDays(1);
            return new[] { startTime, endTime };
        }
    }
}